package logic;

import gui.Block;

public class analisisSintactico {
	

	
	public boolean moverBloque( int pPosBeforeX, int pPosBeforeY, 
								int pPosNewX, 	 int pPosNewY, 
								Block pBloque,   Pestana pPestana){
		boolean add = addBloque( pPosNewX, pPosNewY, pBloque, pPestana);
		// borrar de casilla antigua
		if( add ){
			pPestana.getCasillas()[pPosBeforeX][pPosBeforeY] = null;
		}
		return add;
	}
		
	public boolean addBloque( int pPosNewX, int pPosNewY, Block pBloque, Pestana pPestana){
		boolean moverBloque = false;
		int typeNewBlock = pBloque.getType();
		for( int pos=0;  pos<Constantes.CNT_POS; pos++){
			int posX = pPosNewX+(pos%3)-1;
			int posY = pPosNewY+(pos/3)-1;
			if( posX>=0 && posY >=0  ){
				Block bloqueAdyacente = pPestana.getCasillas()[posX][posY];
				if( bloqueAdyacente != null && pBloque.getAdyacencia()[pos] != Constantes.ADY_NONE ){
					System.out.println("****** Bloque Type: "+pBloque.getType());
					System.out.println("****** Bloque Id  : "+pBloque.getId());
					System.out.println("****** Bloque pide: "+pBloque.getAdyacencia()[pos]);
					System.out.println("****** Inicio pide: "+bloqueAdyacente.getAdyacencia()[Constantes.CNT_POS-pos-1]);
					System.out.println("****** Bloque Pos:"+(pos));
					System.out.println("****** Inicio Pos:"+(Constantes.CNT_POS-pos-1) );
					if( // si su adyacente es un var
						(pBloque.getAdyacencia()[pos] == Constantes.ADY_VAR &&
						bloqueAdyacente.getType() == Constantes.TYPE_VAR) ||
						// o si su adyacente pide una entrada
						(pBloque.getAdyacencia()[pos] == Constantes.ADY_PIPE_OUT &&
						bloqueAdyacente.getAdyacencia()[Constantes.CNT_POS-pos-1] == Constantes.ADY_PIPE_IN) ||
						// o si su adyacente pide una salida
						(pBloque.getAdyacencia()[pos] == Constantes.ADY_PIPE_IN &&
						bloqueAdyacente.getAdyacencia()[Constantes.CNT_POS-pos-1] == Constantes.ADY_PIPE_OUT) ||
						// o si su adyacente termine cualquier bloque
						(bloqueAdyacente.getAdyacencia()[Constantes.CNT_POS-pos-1] == Constantes.ADY_ANY)
						){
							moverBloque = true;
							pPestana.getCasillas()[pPosNewX][pPosNewY] = pBloque; 
					}else{
							moverBloque = false;
							break;
					}
				}
			}
		}
		return moverBloque;
	}






}
